package veterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import veterinaria.excepcion.DAOExcepcion;
import veterinaria.modelo.CFactura;
import veterinaria.modelo.Cliente;
import veterinaria.modelo.Especie;
import veterinaria.modelo.Paciente;
import veterinaria.modelo.Persona;
import veterinaria.modelo.Raza;
import veterinaria.util.ConexionBD;

public class CFacturaDAO extends BaseDAO {

    public Collection<CFactura> buscarPorNombre(String pEst, int pNom) throws DAOExcepcion {
        String sqlFac="select a.FacFecha, a.FacCodigo, a.FacSerie, a.FacNumero, a.FacRUC, a.FacIGV, a.FacTotal, " +
        		"a.FacFlg, c.PerNombre, c.PerDomicilio, d.PacNombre, e.RazNombre, f.EspNombre from tcfactura a, " +
        		"mcliente b, mpersona c, mpaciente d, mraza e, mespecie f where a.mcliente_clicodigo = b.clicodigo " +
        		"and c.percodigo = b.mpersona_percodigo and a.mpaciente_paccodigo = d.paccodigo and d.mraza_razcodigo = e.razcodigo" +
        		" and e.mespecie_espcodigo = f.espcodigo Like ? And c.PerNombre Like ? And a.Faclg<>'E' Order By a.FacFecha";
        Collection<CFactura> lisFac=new ArrayList<CFactura>();
        Connection conFac=null;
        PreparedStatement comFac=null;
        ResultSet cRst=null;
        try {
            conFac=ConexionBD.obtenerConexion();
            comFac=conFac.prepareStatement(sqlFac);
            comFac.setString(1, "%" + pEst + "%");
            comFac.setString(2, "%" + pNom + "%");
            cRst=comFac.executeQuery();
            while (cRst.next()) {
            	CFactura cFac=new CFactura();
                Cliente cCli=new Cliente();
                Persona cPer=new Persona();
                Paciente cPac=new Paciente();
                Raza cRaz=new Raza();
                Especie cEsp=new Especie();
                cFac.setFacFecha(cRst.getString("FacFecha"));
                cFac.setFacCodigo(cRst.getInt("FacCodigo"));
                cFac.setFacSerie(cRst.getInt("FacSerie"));
                cFac.setFacNumero(cRst.getInt("FacNumero"));
                cFac.setFacRUC(cRst.getString("FacRUC"));
                cFac.setFacIGV(cRst.getDouble("FacIGV"));
                cFac.setFacTotal(cRst.getDouble("FacTotal"));
                cFac.setFacFlg(cRst.getString("FacFlg"));
                cPer.setPerNombre(cRst.getString("PerNombre"));
                cPer.setPerDomicilio(cRst.getString("PerDomicilio"));
                cPac.setPacNombre(cRst.getString("PacNombre"));
                cRaz.setRazNombre(cRst.getString("RazNombre"));
                cEsp.setEspNombre(cRst.getString("EspNombre")); 
                cFac.setCliente(cCli);
                cFac.setPaciente(cPac);
                cRaz.setEspecie(cEsp);
                cCli.setPersona(cPer);
                lisFac.add(cFac);

            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
            
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(comFac);
            this.cerrarConexion(conFac);        	
        }
        System.out.println(lisFac.size());
        return lisFac;
    }

    public CFactura insertar(CFactura pReg) throws DAOExcepcion {
    	String cSql = "INSERT INTO tcfactura(FacCodigo,FacTipo,FacSerie,FacNumero,FacRuc,FacNombre,FacDomicilio,FacFecha,FacParcial," +
    			"FacIgv,FacTotal,FacFlg, mcliente_CliCodigo,mcliente_MPersona_PerCodigo,mpaciente_PacCodigo,mpaciente_MEspecie_EspCodigo," +
    			"mpaciente_MRaza_RazCodigo,mpaciente_MCliente_CliCodigo) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        Connection cCon = null;
        PreparedStatement cCom = null;
        ResultSet cRst = null;
        try {
            cCon = ConexionBD.obtenerConexion();
            cCom = cCon.prepareStatement(cSql);
            
            cCom.setString(1, pReg.getFacTipo());
            cCom.setInt(2, pReg.getFacSerie());
            cCom.setInt(3, pReg.getFacNumero());
            cCom.setString(4, pReg.getFacRUC());
            cCom.setString(5, pReg.getFacNombre());
            cCom.setString(6, pReg.getFacDomicilio());
            cCom.setString(7, pReg.getFacFecha());
            cCom.setDouble(8, pReg.getFacParcial());
            cCom.setDouble(9, pReg.getFacIGV());
            cCom.setDouble(10, pReg.getFacTotal());
            cCom.setString(11, "A");
            cCom.setInt(12, pReg.getCliente().getCliCodigo());
            cCom.setInt(13, pReg.getPersona().getPerCodigo());
            cCom.setInt(14, pReg.getPaciente().getPacCodigo());
            cCom.setInt(15, pReg.getEspecie().getEspCodigo());
            cCom.setInt(16, pReg.getRaza().getRazCodigo());
//            cCom.setInt(17. pReg.getPaciente().getCliente().getCliCodigo());
            
            
            int nroErr = cCom.executeUpdate();
            if (nroErr != 1) {
                throw new SQLException("No se pudo insertar");
            }
            int newCod = 0;
            cSql="Select Last_Insert_id()";
            cCom=cCon.prepareStatement(cSql);
            cRst=cCom.executeQuery();
            if (cRst.next()) {
                newCod=cRst.getInt(1);
            }
            pReg.setFacCodigo(newCod);
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return pReg;
    }

}
